/**
 * 主进程与渲染进程通信
 */
import { BrowserWindow, ipcMain } from 'electron'
import { setData, getData } from './store'
import { getWindow, saveWindow, deleteWindow } from './window'
import { join } from 'path'
import icon from '../../resources/icon.png?asset'
import { is } from '@electron-toolkit/utils'

const NODE_ENV = process.env.NODE_ENV

/**
 * 监听切换登录、注册窗口大小变化事件
 * @param callBack 回调函数
 */
export const IpcLoginOrRegister = (callBack) => {
	ipcMain.handle('changeLogin', (_e, data) => {
		callBack(data)
	})
}

/**
 * 监听登录成功到首页窗口大小变化事件
 * @param callBack 回调函数
 */
export const IpcLoginSuccess = (callBack) => {
	ipcMain.handle('loginSuccess', (_e, data) => {
		callBack(data)
	})
}

/**
 * 监听关闭 electron 窗口事件
 * @param callBack 回调函数
 */
export const IpcCloseElectron = (callBack) => {
	ipcMain.handle('closeElectron', () => {
		callBack()
	})
}

/**
 * 监听 electron 窗口事件
 * @param callBack 回调函数
 */
export const IpcWinBtn = (callBack) => {
	ipcMain.handle('winBtn', (e, data) => {
		callBack(e, data)
	})
}

/**
 * 监听渲染进程存储数据到主进程
 * @param callBack 回调函数
 */
export const IpcSetData = () => {
	ipcMain.handle('setData', (_e, { key, value }) => {
		console.log('set===', key, value)
		setData(key, value)
	})
}

/**
 * 监听主进程给渲染进程发送数据
 * @param callBack 回调函数
 */
export const IpcGetData = () => {
	ipcMain.handle('getData', (_e, key) => {
		// e.sender.send('getDataCallBack', getData(key))
		// e.reply('getDataCallBack', getData(key))
		console.log('get===', getData(key))
		return getData(key)
	})
}

/**
 * 监听渲染进程打开新窗口
 */
export const IpcOpenNewWindow = () => {
	ipcMain.handle('openNewWindow', (_e, data) => {
		// console.log('openNewWindow===', data)
		const { windowId, path, title } = data
		let newWindow: BrowserWindow | undefined | null = getWindow(windowId)
		if (!newWindow) {
			newWindow = new BrowserWindow({
				icon,
				width: 800,
				height: 600,
				title,
				// show: false, // 隐藏窗口，等渲染进程准备好后再显示
				autoHideMenuBar: true, // 隐藏菜单栏
				// resizable: false, // 禁止缩放
				titleBarStyle: 'hidden', // 试图隐藏标题栏，但保留边框
				// titleBarOverlay: false, // 不使用标题栏覆盖
				// frame: true, // 启用窗口边框
				// ...(process.platform === 'linux' ? { icon } : {}), // 不同环境下的图标
				webPreferences: {
					preload: join(__dirname, '../preload/index.js'),
					sandbox: false,
					webSecurity: false, // 允许跨域
					nodeIntegration: true, // 允许使用 Node.js API
					contextIsolation: false // 关闭上下文隔离
				}
			})
			saveWindow(windowId, newWindow) // 保存新窗口
			newWindow.setMinimumSize(600, 300) // 设置最小尺寸
			if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
				// newWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + path)
				newWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + `#${path}`)
			} else {
				newWindow.loadFile(join(__dirname, '../renderer/index.html'), { hash: path })
			}
			// 打开调试模式
			if (NODE_ENV === 'development') {
				// newWindow.webContents.openDevTools()
			}
			newWindow.on('ready-to-show', () => {
				newWindow?.setTitle(title)
				newWindow?.show()
			})
			newWindow.once('show', () => {
				let timer = setTimeout(() => {
					clearTimeout(timer)
					newWindow?.webContents.send('newWindowData', data)
				}, 300)
			})
			// 窗口关闭时清理
			newWindow.on('closed', () => {
				deleteWindow(windowId)
			})
		} else {
			newWindow.show()
			newWindow.focus() // 使窗口在最上层
			newWindow.webContents.send('newWindowData', data)
		}
	})
}

/**
 * 监听渲染进程退出登录
 */
export const IpcLogout = (callBack) => {
	ipcMain.handle('logout', async (e) => {
		callBack(e)
		e.sender.send('logoutCallBack')
	})
}
